package org.x.user.vo;

import com.mybatisflex.annotation.ColumnAlias;
import com.mybatisflex.annotation.RelationOneToMany;
import com.mybatisflex.annotation.RelationOneToOne;
import lombok.Data;
import org.x.user.entity.SysDeptEntity;
import org.x.user.entity.SysMenuEntity;
import org.x.user.entity.SysRoleEntity;
import org.x.user.entity.SysUserEntity;

import java.util.List;

@Data
public class UserVO  {
    @ColumnAlias("id")
    private Long userId;
    private String username;
    private String realName;
    private Long deptId;

    // 一对一：部门信息
    @RelationOneToOne(
            targetTable = "sys_dept",
            selfField = "deptId",       // 当前VO的部门ID字段
            targetField = "id",     // 目标表字段
            valueField = "name"     // 要映射的目标字段
    )
    private String deptName;

    // 一对一：部门信息
    @RelationOneToOne(
            targetTable = "sys_dept",
            selfField = "deptId",       // 当前VO的部门ID字段
            targetField = "id"     // 目标表字段
    )
    private SysDeptEntity dept;

    //这里需要关联2张表 sys_role_user 和 sys_role
    @RelationOneToMany(
            joinTable = "sys_role_user",      // 中间表名称
            targetTable = "sys_role",         // 目标表名称
            targetField = "id",           // 角色表的主键字段
            // 主表关联配置（当前实体 -> 中间表）
            selfField = "userId",             // 用户ID字段（当前实体）
            joinSelfColumn = "user_id",       // 中间表中对应的用户ID字段
            // 目标表关联配置（中间表 -> 角色表）
            joinTargetColumn = "role_id"    // 中间表中对应的角色ID字段

    )
    private List<SysRoleEntity> roles;

    // 一对多：角色名称列表（直接映射为字符串）
//    @RelationOneToMany(
//            joinTable = "sys_role_user",      // 中间表名称
//            targetTable = "sys_role",         // 目标表名称
//
//            // 主表关联配置（当前实体 -> 中间表）
//            selfField = "userId",             // 用户ID字段（当前实体）
//            joinSelfColumn = "user_id",       // 中间表中对应的用户ID字段
//
//            // 目标表关联配置（中间表 -> 角色表）
//            joinTargetColumn = "role_id",     // 中间表中对应的角色ID字段
//            targetField = "id" ,          // 角色表的主键字段
//            valueField = "name"     // 要映射的目标字段
//    )
//    private List<String> roleNames;

    private List<String> permissions;
    // 树形菜单（特殊处理）
    private List<UserInfoVO.MenuTreeVO> menuList;

}
